//给定一个二维矩阵 matrix，以下类型的多个请求： 
//
// 
// 计算其子矩形范围内元素的总和，该子矩阵的左上角为 (row1, col1) ，右下角为 (row2, col2) 。 
// 
//
// 实现 NumMatrix 类： 
//
// 
// NumMatrix(int[][] matrix) 给定整数矩阵 matrix 进行初始化 
// int sumRegion(int row1, int col1, int row2, int col2) 返回左上角 (row1, col1) 、右下角
// (row2, col2) 的子矩阵的元素总和。 
// 
//
// 
//
// 示例 1： 
//
// 
//
// 
//输入: 
//["NumMatrix","sumRegion","sumRegion","sumRegion"]
//[[[[3,0,1,4,2],[5,6,3,2,1],[1,2,0,1,5],[4,1,0,1,7],[1,0,3,0,5]]],[2,1,4,3],[1,
//1,2,2],[1,2,2,4]]
//输出: 
//[null, 8, 11, 12]
//
//解释:
//NumMatrix numMatrix = new NumMatrix([[3,0,1,4,2],[5,6,3,2,1],[1,2,0,1,5],[4,1,
//0,1,7],[1,0,3,0,5]]]);
//numMatrix.sumRegion(2, 1, 4, 3); // return 8 (红色矩形框的元素总和)
//numMatrix.sumRegion(1, 1, 2, 2); // return 11 (绿色矩形框的元素总和)
//numMatrix.sumRegion(1, 2, 2, 4); // return 12 (蓝色矩形框的元素总和)
// 
//
// 
//
// 提示： 
//
// 
// m == matrix.length 
// n == matrix[i].length 
// 1 <= m, n <= 200
// 
// -10⁵ <= matrix[i][j] <= 10⁵ 
// 0 <= row1 <= row2 < m 
// 0 <= col1 <= col2 < n 
// 
// 最多调用 10⁴ 次 sumRegion 方法 
// 
//
// 
//
// 
// 注意：本题与主站 304 题相同： https://leetcode-cn.com/problems/range-sum-query-2d-
//immutable/ 
//
// Related Topics 设计 数组 矩阵 前缀和 👍 97 👎 0


package LeetCode.editor.cn;

/**
 * @author ldltd
 * @date 2025-01-15 22:54:51
 * @description LCR 013.二维区域和检索 - 矩阵不可变
 */
public class O4NDxx{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 O4NDxx fun=new O4NDxx();
         int[][] ints = {{3, 0, 1, 4, 2}, {5, 6, 3, 2, 1}, {1, 2, 0, 1, 5}, {4, 1, 0, 1, 7}, {1, 0, 3, 0, 5}};
         int[][] ints2= {{-4},{5}};
//         NumMatrix numMatrix = new NumMatrix(ints);
//         numMatrix.sumRegion(2,1,4,3);
//         NumMatrix numMatrix1 = new NumMatrix(ints2);
//         numMatrix1.sumRegion(0,0,0,0);
     }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
  class NumMatrix {
        int [][] sum;
        int m;
        int n;
    int[][] matrix;
    public NumMatrix(int[][] matrix) {
        m=matrix.length;
        n=matrix[0].length;
        this.matrix=matrix;
        sum=new int[m][n];
        sum[0][0]=matrix[0][0];
        for (int i = 1; i < n; i++) {
            sum[0][i]+=sum[0][i-1]+matrix[0][i];
        }
        for (int i = 1; i < m; i++) {
            sum[i][0]+=sum[i-1][0]+matrix[i][0];
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                sum[i][j]=matrix[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
            }
        }
    }
    
    public int sumRegion(int row1, int col1, int row2, int col2) {
        int del1=col1-1>=0?sum[row2][col1-1]:0;
        int del2=row1-1>=0?sum[row1-1][col2]:0;
        int add=col1-1>=0&&row1-1>=0?sum[row1-1][col1-1]:0;
        return sum[row2][col2]-del1-del2+add;
    }
}

/**
 * Your NumMatrix object will be instantiated and called as such:
 * NumMatrix obj = new NumMatrix(matrix);
 * int param_1 = obj.sumRegion(row1,col1,row2,col2);
 */
//leetcode submit region end(Prohibit modification and deletion)

}
